package com.personal.utils;

import io.jsonwebtoken.*;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtils {

    // 密钥（Base64编码），必须满足 HS256 算法的最小长度要求（≥256位）
    private static final String SECRET_STRING = "ZGhmb3NkaWpoZm9zaWRqZmxrc2RqZmxranNhbDtqZGZwb3Nka2Zsc2RrZmRmZGZk";

    // 过期时间：12小时（单位毫秒）
    private static final long EXPIRATION = 1000 * 60 * 60 * 12; // 12 小时

    // 静态初始化密钥对象
    private static final SecretKey SECRET_KEY;

    static {
        byte[] decodedKey = Base64.getDecoder().decode(SECRET_STRING);
        SECRET_KEY = new javax.crypto.spec.SecretKeySpec(decodedKey, 0, decodedKey.length,
                SignatureAlgorithm.HS256.getJcaName());
    }

    /**
     * 生成 JWT 令牌
     *
     * @param claims 自定义的负载数据
     * @return 返回生成的 JWT 字符串
     */
    public static String generateToken(Map<String, Object> claims) {
        return Jwts.builder()
                .claims() // 新式 API 添加 claims
                .subject("user") // subject 是标准字段（可选）
                .add(claims)
                .expiration(new Date(System.currentTimeMillis() + EXPIRATION))
                .and()
                .signWith(SECRET_KEY) // 自动识别算法
                .compact();
    }

    /**
     * 解析 JWT 令牌
     *
     * @param token JWT 字符串
     * @return 包含 payload 数据的 Map
     */
    public static Map<String, Object> parseToken(String token) {
        try {
            Jws<Claims> jws = Jwts.parser()
                    .verifyWith(SECRET_KEY)
                    .build()
                    .parseSignedClaims(token);

            Claims body = jws.getBody();
            Map<String, Object> result = new HashMap<>();

            // 获取标准字段
            result.put("subject", body.getSubject());

            // 获取自定义字段
            for (String key : body.keySet()) {
                result.put(key, body.get(key));
            }

            return result;
        } catch (JwtException e) {
            throw new RuntimeException("JWT 解析失败: " + e.getMessage(), e);
        }
    }
}
